package com.xxxx.skr.implicitTest

/**
 * @program: day0304
 * @description: 尽信书，则不如无书
 * @author: CoreDao
 * @create: 2021-03-04 08:43
 * */
/**
 * 隐式值和隐式参数 作用域
 * 隐式值无关乎变量名，只关注具体类型，隐式参数同样
 * 不能出现多个类型相同的隐式值
 * 隐式参数放到最前表示所有的参数都是隐式参数
 */
object ImplicitTest {
  //隐式值
  //隐式值与隐式参数类型一致
  implicit val name = "zx"
  implicit val age = 18
//  implicit val age2 = 19

  //隐式参数
  def test1(implicit str:String="lisi")={
    println(str)
  }

  def test2(str:String)={
    println(str)
  }
  //如果函数中隐式参数也有普通的参数的话，要柯里化，将隐式参数放到最后
  //必须柯里化
  //def test3(name:String,implicit age:Int)会报错
  def test3(name:String)(implicit age:Int)={
    println(name +":" + age)
  }
  //放最前面表示都是隐式参数
  def test4(implicit name:String,age:Int)={
    println(name +":" + age)
  }

  def main(args: Array[String]): Unit = {
    //scala会自动在作用域范围内寻找隐式值作为当前的函数参数执行
    test1
    test1()//隐式值优先级靠后
    test1("nihao")

    test3("zx")
    test3("zx")(22)
  }

}
